package cn.liufuwen.websocket.netty;

import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import java.io.InputStream;
import java.security.KeyStore;

public class SslUtil {
    /**
     * 创建一个SSLContext实例，该实例用于配置SSL/TLS连接的安全性。
     *
     * @param path        SSL证书的路径，通常是一个JKS类型的密钥库文件路径。
     * @param sslPassword 用于解密密钥库的密码。
     * @return 返回初始化后的SSLContext对象。
     * @throws Exception 如果密钥库加载或初始化失败，将抛出异常。
     */
    public static SSLContext createSSLContext(String path, String sslPassword) throws Exception {
        // 使用默认资源加载器来加载指定路径的资源。
        ResourceLoader resourceLoader = new DefaultResourceLoader();
        Resource resource = resourceLoader.getResource(path);
        InputStream inputStream = resource.getInputStream();
        char[] passArray = sslPassword.toCharArray();

        // 创建SSLContext实例，指定使用SSLv3协议。
        SSLContext sslContext = SSLContext.getInstance("SSLv3");

        // 加载JKS类型的密钥库，用于存放服务器的证书和私钥。
        KeyStore ks = KeyStore.getInstance("JKS");
        // 从输入流加载密钥库内容，并使用指定的密码进行解密。
        // 加载keytool 生成的文件
        ks.load(inputStream, passArray);

        // 创建KeyManagerFactory，用于生成KeyManager实例，管理服务器的证书和私钥。
        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        // 初始化KeyManagerFactory，使用密钥库和密码。
        kmf.init(ks, passArray);

        // 初始化SSLContext，使用KeyManagerFactory生成的KeyManager。
        sslContext.init(kmf.getKeyManagers(), null, null);

        // 关闭输入流。
        inputStream.close();

        // 返回初始化完成的SSLContext对象。
        return sslContext;
    }

}
